PHP 8.3.4 Released!

strncmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strncmpİlk n karakteri ikil olarak karşılaştırır

Açıklama

strncmp(string $dizge1, string $dizge2, int $uzunluk): int

Karşılaştırma için kullanılacak dizge uzunluğunun üst sınırının belirtilebilmesi dışında strcmp() işlevi gibidir.

Karşılaştırma harf büyüklüğüne duyarlı olarak yapılır.

Bağımsız Değişkenler

dizge1

İlk dizge.

dizge2

İkinci dizge.

uzunluk

Karşılaştırmada kullanılacak karakter sayısı.

Dönen Değerler

dizge1 dizgesi dizge2 dizgesinden küçükse -1; dizge1 dizgesi dizge2 dizgesinden büyükse 1; dizge1 dizgesi ile dizge2 dizgesi aynıysa 0 döndürür.

Sürüm Bilgisi

Sürüm: Açıklama
8.2.0 Bu işlev artık -1 veya 1 döndürüyor, evvelce pozitif vaya negatif bir sayı döndürürdü.

Örnekler

Örnek 1 - strncmp() örneği

<?php

$var1
= 'Hello John';
$var2 = 'Hello Doe';
if (
strncmp($var1, $var2, 5) === 0) {
echo
'Harf büyüklüğüne duyarlı dizge karşılaştırmasında $var1 ve $var2 dizgelerinin ilk beş karakteri aynıdır.';
}
?>

Ayrıca Bakınız

  • strncasecmp() - İlk n karakteri ikil ve harf büyüklüğüne duyarsız olarak karşılaştırır
  • preg_match() - Bir düzenli ifadeyi eşleştirmeye çalışır
  • substr_compare() - İki dizgenin belli bir konumdan itibaren belli uzunluktaki parçalarını bayt bayt karşılaştırır
  • strcmp() - İkil olarak güvenilir dizge karşılaştırması yapar
  • strstr() - İlk alt dizgeyi bulur
  • substr() - Dizgenin bir kısmını döndürür

add a note

User Contributed Notes 5 notes

up
10
codeguru at crazyprogrammer dot cba dot pl
16 years ago
I ran the following experiment to compare arrays.

1 st - using (substr($key,0,5 == "HTTP_") & 2 nd - using (!strncmp($key, 'HTTP_', 5))

I wanted to work out the fastest way to get the first few characters from a array

BENCHMARK ITERATION RESULT IS:
if (substr($key,0,5 == "HTTP_").... - 0,000481s
if (!strncmp($key, 'HTTP_', 5)).... - 0,000405s

strncmp() is 20% faster than substr() :D

<?php
// SAMPLE FUNCTION
function strncmp_match($arr)
{
foreach (
$arr as $key => $val)
{
//if (substr($key,0,5 == "HTTP_")
if (!strncmp($key, 'HTTP_', 5))
{
$out[$key] = $val;
}
}
return
$out;
}

// EXAMPLE USE
?><pre><?php
print_r
(strncmp_match($_SERVER));
?></pre>

will display code like this:

Array
(
[HTTP_ACCEPT] => XXX
[HTTP_ACCEPT_LANGUAGE] => pl
[HTTP_UA_CPU] => x64
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_USER_AGENT] => Mozilla/4.0
(compatible; MSIE 7.0;
Windows NT 5.1;
.NET CLR 1.1.4322;
.NET CLR 2.0.50727)
[HTTP_HOST] => XXX.XXX.XXX.XXX
[HTTP_CONNECTION] => Keep-Alive
[HTTP_COOKIE] => __utma=XX;__utmz=XX.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
)
up
9
salehrezq at gmail dot com
7 years ago
A note not included in the documentation:

int strcmp ( string $str1 , string $str2 )

Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.

My addendum:
If str1 and str2 are not equal, and str1 is a sub-string of str2 or vise versa. The returned int value will be negative or positive indicating how many characters the difference is between the two strings in absolute terms.

Example:

<?php
$str1
= "phpaaa";
$str2 = "php";

echo
strcmp($str1, $str2); // 3
?>

since str2 = "php" is a sub-string of str1 = "phpaaa" and "phpaaa" is greater than "php" the returned value is positive and is 3 indicating how many characters the difference is between the two strings.

If you replace the value of str1 with str2 the result will be -3 (negative) but still indicates the absolute difference which is 3
up
4
samy
6 years ago
I just want to highlight that (at least on php7), when testing for the existence of a string in the beginning of another string you should consider using substr or strpos (if performances is an issue).

Here is a small benchmark (for what it's worth):
<?php
$n
= 'abcd';
$l = strlen($n);
$haystack0 = base64_encode(random_bytes(128));

//heat
$r = 1;
for (
$i = 0; $i < 100000000; $i++)
$r += $r * $r % 10000;

//tests
$k = 30000000;
$res = array();
foreach (array(
'found' => $n . $haystack0, 'not-found' => strrev($n) . $haystack0) as $f => $haystack) {
$m = microtime(true);
for (
$i = 0; $i < $k; $i++)
!
strncmp($haystack, $n, $l) && $r++;
$res["strncmp-$f"] = -$m + ($m = microtime(true));

for (
$i = 0; $i < $k; $i++)
(
strpos($haystack, $n) === 0) && $r++;
$res["strpos-$f"] = -$m + ($m = microtime(true));

for (
$i = 0; $i < $k; $i++)
(
substr($haystack, 0, $l) === $n) && $r++;
$res["substr-$f"] = microtime(true) - $m;
}

//print
asort($res);
print_r($res);
echo
"\n$r"; // makes sure no auto-optimization occurs
?>

This outputs:
<?php /*
[strpos-found] => 1.3313138484955
[substr-not-found] => 1.4832630157471
[substr-found] => 1.6976611614227
[strpos-not-found] => 2.0043320655823
[strncmp-not-found] => 2.0969619750977
[strncmp-found] => 2.3616981506348
*/
?>
up
4
bobvin at pillars dot net
12 years ago
For checking matches at the beginning of a short string, strpos() is about 15% faster than strncmp().

Here's a benchmark program to prove it:

<?php
$haystack
= "abcdefghijklmnopqrstuvwxyz";
$needles = array('abc', 'xyz', '123');
foreach (
$needles as $needle) {
$times['strncmp'][$needle] = -microtime(true);
for (
$i = 0; $i < 1000000; $i++) {
$result = strncmp($haystack, $needle, 3) === 0;
}
$times['strncmp'][$needle] += microtime(true);
}
foreach (
$needles as $needle) {
$times['strpos'][$needle] = -microtime(true);
for (
$i = 0; $i < 1000000; $i++) {
$result = strpos($haystack, $needle) === 0;
}
$times['strpos'][$needle] += microtime(true);
}
var_export($times);
?>
up
4
elloromtz at gmail dot com
13 years ago
if length is 0 regardless what the two strings are, it will return 0

<?php
strncmp
("xybc","a3234",0); // 0
strncmp("blah123","hohoho", 0); //0
?>
To Top